Soru & Cevap

Sunucu gelen saldırı isteklerini engellemiyor

31.07.2019 - 09:10
Cyberpanel kullanıyorum.Rest API kurulu sunucuda.Bazi kullanıcılar PHP dosyalarını while döngüsüne falan sokuyorlar sanırım.Aynı ipden bir anda yüzlerce istek geliyor.Sunucu hiçbir şey yapmıyor.Boyle bir şeyle karşılaşan oldu mu?
13 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user aytac.abay
aytac.abay
22.09.2019 - 07:37

Web server olarak ne kullanıyorsun ? Apache server la da engelleye bilirsin yada nginx ile hangisini kullanıyorsan bu web serverlar ile aynı ip üzernden gelen belirli bir istekten sayısını aşan ipleri blocklaya bilirsinin veya birden fazla farklı iplerden gelen belirli bir saniye içerisinde birden fazla istek olan iplerde engelleye bilirsin. 

Profile picture for user a.kerim.cetinbas
a.kerim.cetinbas
08.08.2019 - 02:25

apiye ayni sunucudan baglaniyorsan, cors engelleyebilirsin, 
değilsede söyle birşey deneyebilirsin​
API yi ne ile yazdin bilmiyorum ama kendine göre uyarlıyabilirsin


 

edit: yabanci biri yazmiş tam senin istedigin sey, sesion tutmadan cors isteklerini süzüyor :)

 

function ht_request_limiter() {
    if (!isset($_SERVER['REMOTE_ADDR'])) { return; } // Maybe its impossible, however we check it first
    if (empty($_SERVER['REMOTE_ADDR'])) { return; } // Maybe its impossible, however we check it first
    $path = '/your/path/ipsec/'; // I use a function to validate a path first and return if false...
    $path = $path.$_SERVER['REMOTE_ADDR'].'.txt'; // Real file path (filename = <ip>.txt)
    $now = time(); // Current timestamp
    if (!file_exists($path)) { // If first request or new request after 1 hour / 24 hour ban, new file with <timestamp>|<counter>
        if ($handle = fopen($path, 'w+')) {
            if (fwrite($handle, $now.'|0')) { chmod($path, 0700); } // Chmod to prevent access via web
            fclose($handle);
        }
    }
    else if (($content = file_get_contents($path)) !== false) { // Load existing file
        $content = explode('|',$content); // Create paraset [0] -> timestamp  [1] -> counter
        $diff = (int)$now-(int)$content[0]; // Time difference in seconds from first request to now
        if ($content[1] == 'ban') { // If [1] = ban we check if it was less than 24 hours and die if so
            if ($diff>86400) { unlink($path); } // 24 hours in seconds.. if more delete ip file
            else {
                header("HTTP/1.1 503 Service Unavailable");
                exit("Your IP is banned for 24 hours, because of too many requests.");
            }
        }
        else if ($diff>3600) { unlink($path); } // If first request was more than 1 hour, new ip file
        else {
            $current = ((int)$content[1])+1; // Counter + 1
            if ($current>200) { // We check rpm (request per minute) after 200 request to get a good ~value
                $rpm = ($current/($diff/60));
                if ($rpm>10) { // If there was more than 10 rpm -> ban (if you have a request all 5 secs. you will be banned after ~17 minutes)
                    if ($handle = fopen($path, 'w+')) {
                        fwrite($handle, $content[0].'|ban');
                        fclose($handle);
                        // Maybe you like to log the ip once -> die after next request
                    }
                    return;
                }
            }
            if ($handle = fopen($path, 'w+')) { // else write counter
                fwrite($handle, $content[0].'|'.$current .'');
                fclose($handle);
            }
        }
    }
}